# -*- coding: utf-8 -*-
import random

a = 0
b = 7
nm = 4
class ga:
    def bi(self, x):
        """Представление числа в двоичном коде с нужным количеством символов"""
        self.x = x
        p = bin(x)[2:]
        while len(p) < len(bin(b)[2:]):
            p = '0' + p
        return p
    def pop(self):
        """Формируем популяцию"""
        self.n = []
        for j in range(nm):
            i = random.randint(a,b)
            self.n.append(self.bi(i))
        return self.n
    def pair(self):
        """Формируем брачные пары"""
        self.b = self.pop()#родители
        self.pr = [[],[]]
        for i in range(len(self.b)):
            self.pr[0].append(self.b[i])
        for j in range(len(self.b)):
            o = random.randint(0, 3)
            self.pr[1].append(self.b[o])
        i = 0
        while i < len(self.pr[0]):
            if self.pr[0][i] == self.pr[1][i]: #Одинаковые между собой особи не вступают в пары
                for j in range(len(self.pr)):
                    del self.pr[j][i]
            else:
                i += 1
        return self.pr, self.b # Запоминаем родителей
    def brkpnt(self):
        """Определяем точки разрыва"""
        self.y = self.pair()
        self.zh = [[],[]]
        for i in range(len(self.y[0][0])):
                       d = random.randint(1,2)#Определяем положение точки разрыва
                       nv = len(bin(b)[2:])
                       """До точки разрыва"""
                       for j in range(len(self.y[0])):
                           self.zh[0].append(self.y[0][j][i][:d])
                       """После точки разрыва""" 
                       for k in range(len(self.y[0])):
                           self.zh[1].append(self.y[0][k][i][d:nv])        
        return self.zh, self.y[1]
    def cld(self):
        """Получаем потомков"""
        self.q = self.brkpnt()
        self.ch = []
        i = 0
        j = 0
        while i < len(self.q[0][0]):
            if i % 2 == 0:
                self.ch.append(self.q[0][j][i]+self.q[0][j+1][i+1])
            elif i % 2 == 1:
                self.ch.append(self.q[0][j][i]+self.q[0][j+1][i-1])
            i += 1
        return self.ch
    def mutation(self):
        """Мутация"""
        mp = 0.3 #Вероятность мутации
        self.w = self.cld()
        self.r = []
        """Разбиваем каждого потомка на отдельные части"""
        #Присваивание для элемента строки невозможно
        for m in range(len(self.w)):
            self.r.append([])
        for i in range(len(self.w)):
            for j in range(len(self.w[0])):
                self.r[i].append(self.w[i][j])
        """Мутируем потомков"""
        for k in range(len(self.w)):
            mpi = random.random()
            mpg = random.randint(0,2)#Случайным образом выбранный ген"
            if mpi <= mp:
                if self.r[k][mpg] == '1':
                    self.r[k][mpg] = '0'
                    self.r[k] = ''.join(self.r[k])
                elif self.r[k][mpg] == '0':
                    self.r[k][mpg] = '1'
                    self.r[k] = ''.join(self.r[k])
            else:
                self.r[k] = ''.join(self.r[k])

        return self.r      
        
                       
        

u = ga()

print u.mutation()




